// function Person (name) {
//   this.name = name
//   this.getName = function() {
//       console.log(this)
//      console.log(this.name)  
//   }
// }

// function Student(age) {
//   this.age = age
// }
// var p = new Person('李少斌')
// Student.prototype = p
// var s = new Student(200)
// s.getName()
// Person.prototype.getName = function() {
//   console.log(this.name)
// }
// var p = Person('刘德华')
// p.getName()

// class Person {
//   #car = '兰博基尼';
//   constructor(name) {
//     this.name = name
//     this.ageNum = 0
//   }
//   set age(val) {
//     console.log('set值', val)
//     this.ageNum = val
//   }
//   get age() {
//     return this.ageNum
//   }
//   getCar() {
//     console.log(this.#car)
//   }
//   #setCar(car) {
//     this.#car = car
//   }
//   setCar() {
//     // this.#setCar(car)
//     console.log(this)
//     console.log(this.ageNum)
//   }
// }
// var p = new Person('刘德华')
// const {setCar: setCar} = p
// const setCar = p.setCar
// p.getCar()
// console.log(p.#car)
// setCar()
// class Student extends Person {
//   constructor() {
//     let obj = super()
//     this = obj // 调用父类的构造方法，同时修改父类中的this指向子类的实例(也就是子类中的this)
//     // this ==> s
//     this.color = ''
//   }
// }
// var s = new Student()
// console.log(Student.car)
// var s = new Student()
// console.log(s.car)
// Person.prototype.getAge = function () {
//   console.log(this.age)
// }
// Person.getName()
// var p = new Person('刘德华')
// p.__proto__.getAge = function () {
//   console.log(this.age)
// }
// p.age = 100
// console.log(p)
// p.getName()



// typeof, instanceof, Object.prototype.toString.call() 判断数据类型
// constructor
// p.constructor = {name: '李少斌'}
// console.log(p.constructor)

// let array = [1,2,3,4]
// class Point {
//   constructor(x, y) {
//     this.x = x;
//     this.y = y;
//   }
// }

// class ColorPoint extends Point {
//   constructor(x, y, color) {
//     // this.color = color; // ReferenceError
//     super(x, y);
//     this.color = color; // 正确
//   }
// }

// var c = new ColorPoint(1,2,'red')

function StackFunc(value) {
  this.value = value
  this.top = value.length-1
  this.length = value.length
  this.push = function(e) {
    this.value.push(e)
    this.top = this.top + 1
    this.length +=1
  }
  this.pop = function() {
    if(this.length <=0) {
      return false
    }
    let val = this.value.pop()
    this.top = this.top - 1
    this.length -= 1
    return val
  }
  this.peek = function() {
    return this.length > 0?this.value[this.top]:false
  }
  this.size = function() {
    return this.length
  }
  this.empty = function() {
    return this.top === -1 ? true : false
  }
}
var s = new StackFunc([1, 2])
// s.push(10)
s.push(100)
// console.log()
console.log(s.pop())
console.log(s.pop())

// console.log(s)
console.log(s.pop())
console.log(s)
// console.log(s)
console.log(s.pop())

// console.log(s)
console.log(s.empty())


class Stack{
  constructor(value) {
    this.value = value
    this.top = value.length-1
    this.length = value.length
  }
  push(e) {
    this.value.push(e)
    this.top = this.top + 1
    this.length +=1
  }
  pop() {
    if(this.length <=0) {
      return false
    }
    let val = this.value.pop()
    this.top = this.top - 1
    this.length -= 1
    return val
  }
  peek() {
    return this.length > 0?this.value[this.top]:false
  }
  size() {
    return this.length
  }
  empty() {
    return this.top === -1 ? true : false
  }
}
var s1 = new Stack([6,7,8])
// s.push(10)
s1.push(100)
// console.log(s1)

// console.log()
console.log(s1.pop())
// console.log(s1)

console.log(s1.pop())

// console.log(s1.pop())
console.log(s1)
// console.log(s)
// console.log(s1.pop())

// console.log(s)
console.log(s1.empty())



